﻿using System;
using System.Linq;
using User.EF.Contracts;
using User.EF.Model;

namespace User.EF.Queries
{
    /// <summary>
    /// Allgemeine Mitarbeiter abfragen über die gesamte Mitarbeiterliste
    /// </summary>
    public class MemberQueries : IMemberQueries
    {
        #region Member
        public MainModelContainer Context { get; private set; }
        #endregion

        #region Initialize
        public MemberQueries(MainModelContainer context)
        {
            if (context == null)
            {
                throw new NullReferenceException("MainModelContainer is null");
            }

            Context = context;
        }
        #endregion

        #region Queries

        /// <summary>
        /// Gibt die ersten X Member aus dem System zurück
        /// </summary>
        /// <param name="take">Anzahl der Member die zurückgegeben werden sollen.</param>
        /// <returns>Liste mit den Membern</returns>
        public IQueryable<Member> GetMembers(int take)
        {
            return Context.MemberSet.Take(take).OrderBy(p => p.Username);
        }

        /// <summary>
        /// Sucht die ersten X Member heraus die auf den übergebenen Suchstring passen.
        /// </summary>
        /// <param name="take">Anzahl der Member die zurückgegeben werden sollen.</param>
        /// <param name="searchString">Der Suchstring</param>
        /// <returns></returns>
        public IQueryable<Member> GetMembers(int take, string searchString)
        {
            if (string.IsNullOrEmpty(searchString))
            {
                return GetMembers(take);
            }

            //Unseren Suchstring aufteilen mit Split am leerzeichen
            string[] search = searchString.Trim().ToLower().Split(' ');
            IQueryable<Member> members = Context.MemberSet;

            //Dann alle Suchbegriffe durchgehen und unserer Suche entsprechend hinzufügen.
            //Dabei werden alle Wortsuchen mit "AND" verknüpft
            foreach (string eSearchString in search)
            {
                string value = eSearchString;
                //Vorname, nachname und Username werden nach dem Suchstring durchsucht.
                members = members.Where(p => p.MemberExtension.Firstname.ToLower().Contains(value) ||
                                                p.MemberExtension.Lastname.ToLower().Contains(value) ||
                                                p.Username.ToLower().Contains(value));
            }

            //Zurückgegeben unserer GesamtQuery.
            return members.Take(take).OrderBy(p => p.Username);
        }

        /// <summary>
        /// Gibt die Gesamtanzahl der Member im System zurück
        /// </summary>
        public int MemberCount()
        {
            return Context.MemberSet.Count();
        }
        #endregion
    }
}
